﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;


namespace Sinacor.Tools.Negocio
{
    public class Porta
    {
        private List<Sinacor.Tools.Entidade.Modulo> getPorts()
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            return dados.getPorts();          
        }

        public List<Sinacor.Tools.Entidade.Modulo> getPorts(string modulo)
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            return this.filtrarModulos(dados.getPorts(), modulo);
        }

        public void incluir(Sinacor.Tools.Entidade.Modulo pModulo)
        {
            this.validar(pModulo, true);
            
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            lock (dados)
            {
                setNextPorts(pModulo);
                dados.incluir(pModulo);
            }
        }

        private void setNextPorts(Sinacor.Tools.Entidade.Modulo pModulo)
        {
            List<Sinacor.Tools.Entidade.Modulo> modulos = this.getPorts(string.Empty, string.Empty, string.Empty);
            Sinacor.Tools.Entidade.Modulo modulo = new Sinacor.Tools.Entidade.Modulo();
            int qtdeLoops = modulos.Count;
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (modulos[i].Porta > modulo.Porta)// && modulos[i].PortaMex > modulo.PortaMex)
                {
                    modulo = modulos[i];
                }
            }

            
            //pModulo.Porta = modulo.Porta + 2;
            //pModulo.PortaMex = modulo.PortaMex + 2;
            pModulo.Porta = modulo.Porta + 1;

        }
        public void exportar()
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            
            dados.exportarParaOracle();
        }


        protected void validar(Sinacor.Tools.Entidade.Modulo pModulo, bool ehInclusao)
        {
            string mensagem = string.Empty;
            if (string.IsNullOrEmpty(pModulo.Nome))
            {
                mensagem += "O nome do módulo é obrigatório!";
            }

            /* o nome do serviço não é mais obrigatório
            if (string.IsNullOrEmpty(pModulo.Servico))
            {
                mensagem += "O nome do serviço é obrigatório!";
            }*/

            if (string.IsNullOrEmpty(pModulo.Submodulo))
            {
                mensagem += "O nome do submodulo é obrigatório!";
            }

            if (!string.IsNullOrEmpty(mensagem))
            {
                throw new Exception(mensagem);
            }

            if (ehInclusao && filtrarSubModulos(this.getPorts(), pModulo.Nome, pModulo.Submodulo).Count > 0)
            {
                throw new Exception("Este Sub Módulo já está cadastrado para este módulo!");
            }
        }





        public List<Sinacor.Tools.Entidade.Modulo> getPorts(string modulo, string submodulo, string sortExpression)
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            List<Sinacor.Tools.Entidade.Modulo> lista = dados.getPorts();

            if (modulo != string.Empty && submodulo == string.Empty)
            {
                lista = this.filtrarModulos(lista, modulo);
            }
            else if (modulo != string.Empty && submodulo != string.Empty)
            {
                lista = this.filtrarSubModulos(lista, modulo, submodulo);
            }
            
            OrdenarLista(lista, sortExpression);
            return lista;
        }

        private void OrdenarLista(List<Sinacor.Tools.Entidade.Modulo> modulos, string sortExpression)
        {
            if (! string.IsNullOrEmpty(sortExpression))
            {
                Sinacor.Tools.Entidade.Modulo.PropriedadeSort = sortExpression;
                modulos.Sort(new Sinacor.Tools.Entidade.Modulo());
            }

        }


        public List<Sinacor.Tools.Entidade.Modulo> getModulos()
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            return this.filtrarModulos(dados.getPorts());
        }

        public List<Sinacor.Tools.Entidade.Modulo> getSubmodulos(string idModulo)
        {
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            return this.filtrarSubModulos(dados.getPorts(), idModulo);
        }


        private List<Sinacor.Tools.Entidade.Modulo> filtrarModulos(List<Sinacor.Tools.Entidade.Modulo> todosModulos, string modulo)
        {
            int qtdeLoops = todosModulos.Count;
            List<Sinacor.Tools.Entidade.Modulo> modulos = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (todosModulos[i].Nome == modulo || modulo == string.Empty)
                {
                    modulos.Add(todosModulos[i]);
                }
            }
            return modulos;
        }

        private List<Sinacor.Tools.Entidade.Modulo> filtrarSubModulos(List<Sinacor.Tools.Entidade.Modulo> todosModulos, string idModulo, string idSubmosulo)
        {
            int qtdeLoops = todosModulos.Count;
            List<Sinacor.Tools.Entidade.Modulo> submodulos = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if ((todosModulos[i].Nome == idModulo && todosModulos[i].Submodulo == idSubmosulo) || (idModulo == string.Empty && idSubmosulo == string.Empty))
                {
                    submodulos.Add(todosModulos[i]);
                }
            }
            return submodulos;
        }


        private List<Sinacor.Tools.Entidade.Modulo> filtrarModulos(List<Sinacor.Tools.Entidade.Modulo> todosModulos)
        {
            int qtdeLoops = todosModulos.Count;
            List<Sinacor.Tools.Entidade.Modulo> modulos = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (!this.jaFoiAdicionado(modulos, todosModulos[i], "Nome"))
                {
                    modulos.Add(todosModulos[i]);
                }
            }
            return modulos;
        }

        private List<Sinacor.Tools.Entidade.Modulo> filtrarSubModulos(List<Sinacor.Tools.Entidade.Modulo> todosModulos, string idModulo)
        {
            int qtdeLoops = todosModulos.Count;
            List<Sinacor.Tools.Entidade.Modulo> submodulos = new List<Sinacor.Tools.Entidade.Modulo>();
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (todosModulos[i].Nome == idModulo || idModulo == string.Empty)
                {
                    if (!this.jaFoiAdicionado(submodulos, todosModulos[i], "Submodulo"))
                    {
                        submodulos.Add(todosModulos[i]);
                    }
                }
            }
            return submodulos;
        }

        private bool jaFoiAdicionado(List<Sinacor.Tools.Entidade.Modulo> modulos, Sinacor.Tools.Entidade.Modulo modulo, string propriedade)
        {
            int qtdeLoops = modulos.Count;
            for (int i = 0; i < qtdeLoops; i++)
            {
                if (Equals(modulos[i].GetType().GetProperty(propriedade).GetValue(modulos[i], null), modulo.GetType().GetProperty(propriedade).GetValue(modulo, null)))
                {
                    return true;
                }
            }
            return false;
        }

        
        public void atualizar(Sinacor.Tools.Entidade.Modulo pModuloOld, Sinacor.Tools.Entidade.Modulo pModuloNew)
        {
            this.validar(pModuloOld, false);
            this.validar(pModuloNew, true);
            Sinacor.Tools.Dado.DadoPorta dados = new Sinacor.Tools.Dado.DadoPorta();
            lock (dados)
            {
                dados.atualizar(pModuloOld, pModuloNew);
            }
        }



    }
}
